package a_collection.collection.list_demo;


import java.util.Arrays;

/**
 * description:天王盖地虎，宝塔镇河妖 班规v2.0
 * createTime: 2018-11-21 14:27
 * 实现原理：
 *  采用动态数组实现，默认创建了一个空数组 ，在内存中分配【连续】的空间(cpu预读特性)
 * 	第一次添加元素，扩容量为10，之后的扩容算法：new = old +1/2*old(移位运算符)
 * 	不适合做删除或插入（搬家）操作 线程不安全，适合单线程使用
 **/
public class MyArrayList extends AbstractMyArrayList {

    //声明一个Object数组
    private Object[] objectArray;
    //表示元素的数量，默认size=0，
    //如果int类型数据没有被赋值，默认赋值为 0
    private int count;


    public MyArrayList() {
        //初始化一个length为10的数组
        this.objectArray = new Object[10];
    }

    //initialCapacity  initial：初始化  Capacity：容量
    public MyArrayList(int initialCapacity) {
        if (initialCapacity <= 0) {
            this.objectArray = new Object[10];
        } else {
            this.objectArray = new Object[initialCapacity];
        }
    }


    //添加
    public boolean add(Object o) {
        if (count >= objectArray.length) {
            //需要扩容（换一个大房子）
            int oldLength = objectArray.length;
            //15 = 10 + 10/2
            int newLength = oldLength + oldLength / 2;
            //int newLength = oldLength + oldLength >>1 ;
            //使用Arrays工具类的copyOf(老数组，新长度)方法，为数组扩容
            objectArray = Arrays.copyOf(objectArray, newLength);
        }
        //把数据存入数组
        objectArray[count] = o;
        count++;

        return true;
    }

    //添加
    public boolean add(int index,Object o) {
        if (count >= objectArray.length) {
            int oldLength = objectArray.length;
            int newLength = oldLength + oldLength / 2;
            objectArray = Arrays.copyOf(objectArray, newLength);
        }
        /*
         * 移动位置  参数：index=3 count = 6  数组索引0-5
         *      i=6 objectArray[6] = objectArray[5]
         *      i=5 objectArray[5] = objectArray[4]
         *      i=4 objectArray[4] = objectArray[3]
         *      objectArray[3] = "a";
         */

        for (int i = count; i > index; i--) {
            objectArray[i] = objectArray[i - 1];
        }
        //把数据存入数组
        objectArray[index] = o;
        count++;

        return true;
    }


    //获取
    public Object get(int index) {
        return objectArray[index];
    }


    //移除
    public boolean remove(int index) {

        for (int i = index; i < count - 1; i++) {
            objectArray[i] = objectArray[i + 1];
        }
        objectArray[count - 1] = null;
        count--;
        return true;
    }

    //返回列表大小
    public int size() {
        return count;
    }

    //是否为空
    public boolean isEmpty() {
        //return count == 0;
        if (count == 0){
            return true;
        }else {
            return false;
        }

    }

    @Override
    public boolean remove(Object o) {
        return false;
    }

    @Override
    public int indexOf(Object o) {
        return 0;
    }

    @Override
    public boolean contains(Object o) {
        return false;
    }


    // public boolean remove(Object o)


}
